<?
/*书接前文*/
/*6.10理解PHP面向对象的高级功能*/
/*使用per-class常量*/
class perclass{
	const a="123456789";
	public $b;
	
	public static function echoo(){
		echo"aaa";
		}
	}
	
class aaa extends perclass{};
echo perclass::a;
perclass::echoo();
$a=new perclass ();

/* instanceof means 是一个实例属于xxx*/
if($a instanceof perclass){echo "属于";}
$b=new aaa();
if($b instanceof perclass){echo "属于";}
/*类的类型提示的思想*/
function aaaa(aaa $a){
	echo "right";
	}//意思是$a必须instanceof aaa
aaaa($b);

/*6.10.4延迟静态绑定*/
class AA{
	public static function who(){
		echo "11";
		}
	public static function test(){
		static::who();
		}	
	}
class BB extends AA{
	public static function who(){
		echo "22";
		}
	}

BB::test();//应该返回22
//接下来看不用static用this的区别

class CC{
	public function who(){
		echo "11";
		}
	public function test(){
		$this->who();
		}
	}
class DD extends CC{
	public function who(){
		echo "22";
		}
	}
$c=new DD();
$c->test();//应该返回22

class EE{
	private $who="11";//此处private和public、protected的值不一样
	public function test(){
		echo $this->who;
		}
	}
class FF extends EE{
	public $who="22";
	}

$d=new FF;
$d->test();//应该返回22
//综上所诉我记错了，只有$who为private的时候才会打印11
//综上所述所谓的延迟静态绑定就是如此的，只是一个解释而已，没什么用。这个是合乎实理的。
//教材只是为了说明父类函数test可以引用子类的static who，但是实际上我认为子类在创建的时候已经创建了一个
//子类的test，子类的test调用子类的who，多么合情合理啊。解释做什么呢？

/*6.10.5克隆对象*/
//没看明白有什么用，通过一个例子看看。
/*
$x=111;
$y=clone $x;
echo "<br />$x $y ";
$x=0;
echo "<br />$x $y ";
reset($x);
echo "<br />$x $y ";
*/
//例子运行失败 特么的clone只能用于对象。再来
$x=clone $d;
echo $x->who;//11
//难道不能用“=”吗？
$y=$d;
echo "M<br />";
$y->test();
//也可以啊…… 那有毛用？网上搜索了一下 指向不同的内存。
echo "<br />";
$d->who="new";
echo $x->who;//x是克隆的 新的内存
echo $y->who;//y是赋值的 跟着d变化 =自带&地址符

//搜第四内，好像和数不太一样?
$a1=1;
$b1=$a1;
$b2=&$a1;
$a1=2;
echo "<br />$a1 $b1 $b2";//果然不一样
@reset($a1);//reset好像是专门针对数组的，这条报错,不起作用
unset($a1);//会打断地址符的链接
$a1=3;
echo "<br />$a1 $b1 $b2";

/*6.10.6使用抽象类*/
abstract class chouxiang{}
//new chouxiang();//报错，抽象类不能实例化
//抽象类不能实例化 里面的方法也不能实现，真搞不懂有什么用，以后再看吧



/*6.10.7使用__call()重载方法*/
//这本书讲的不明白  我去别的地方看一下。
//__call如果在类中调用一个不存在的方法，就会自动调用__call
class studycall{
	function __call($name,$farray){
		echo "我被调用了！";
		}
	}
$call1=new studycall();
$call1->te22ast(1);
//现在懂了。。。试一发
class studycall2{
	public function __call($name,$farray){
		$farraystr="";
		foreach($farray as $v){$farraystr.=$v.",";}
		echo "<br />你所调用的函数function ".$name."()不存在！你输入的参数(".rtrim($farraystr,',').")我们无法计算。";
		}
	}

$call2=new studycall2();
$call2->displayname(2,3,"hiugsafil","ksdfgaiuhgo",22,"afhauhfioahwoeifhao");

/*6.10.8使用__autoload*/
//当实例化一个没有声明的类的时候调用，他不是类方法而是一个函数
function __autoload($name){
	include_once($name.".inc");
	echo "不要报错了啊！还是致命的！";
	//我在函数里加载一个类试试呢
	class luhao{}
		}

//@new luhao();
//卧槽 为什么还会报错？

echo "123";
//网上说用sql_autoload_register();试一下呢
//sql_autoload_register(function($class_name){echo"没有这个类，我报错了没？";});
//$a3=new luhao();
//也不行……
//估计是什么没打开吧……
$a5=new page();
$a5->display();
//原来是这样用的……我好孤独啊自己一个人学。。。

/*6.10.9实现迭代器和迭代……卧槽 看起来就好难*/
class myclass1{
	public $a=3;
	public $b=4;
	public $c=5;
	public $d=6;
	}
$e1=new myclass1();
foreach($e1 as $key=>$value){
	echo $key."=>".$value."<br />";
	}
//通过搜索了解了迭代和接口的意思（大概意思），文中的是一个基类，比较难懂，应该放弃，以后再看
//现在还不知道objectiterrator是不是系统自带的，如果不是的话要回来读懂它。
//接口类似于提前定义一个子类，迭代就是不停地换变量里的数据（还不确定）


/*6.10.10将类转化成字符串*/
//__tostring()尝试打印时会调用这个函数
//var_export()此函数返回关于传递给该函数的变量的结构信息，它和var_dump() 类似，不同的是其返回的表示是合法的 PHP 代码

class myclass2{
	public $a=2;
	public $b=3.14;
	public function __tostring(){
		//return var_export($this,true);//tostring 必须用return来使用这个var_export()函数
		echo"<br />";
		return var_dump($this);
		}
	}
$f=new myclass2;
print_r($f);
/*6.10.11使用反射*/

$classs=new reflectionclass ("page");//估计这个也是一个系统函数 它内部还带了一个__tostring
echo "<pre>".$classs."</pre>";

/*-------------------end unit6这一章迷迷糊糊看完了*/
?>
